<?php
// +----------------------------------------------------------------------
// | ThinkBLOG (Build on ThinkPHP)
// +----------------------------------------------------------------------
// | @link ( http://www.yurnero.net )
// +----------------------------------------------------------------------
// | @licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | @author nicholas <nicholasinlove@126.com>
// +----------------------------------------------------------------------
// | $Id: UsersModel.class.php 114 2012-04-13 01:51:48Z nicholasinlove1986@gmail.com $
// +----------------------------------------------------------------------


class UsersModel extends CommonModel {

	/**
	 * 
	 * 字段信息
	 * 
	 * @var Model
	 */
	protected $fields = array (
		0 => 'userid', 
		1 => 'username', 
		2 => 'nicename', 
		3 => 'email', 
		4 => 'url', 
		5 => 'password', 
		6 => 'created', 
		7 => 'lastactivity', 
		8 => 'ip', 
		9 => 'logged', 
		10 => 'roleid', 
		11 => 'status', 
		12 => 'meta', 
		'_autoinc' => true, 
		'_pk' => 'userid', 
		'_type' => array (
			'userid' => 'smallint(5) unsigned', 
			'username' => 'varchar(60)', 
			'nicename' => 'varchar(60)', 
			'email' => 'varchar(255)', 
			'url' => 'varchar(255)', 
			'password' => 'varchar(64)', 
			'created' => 'int(11)', 
			'lastactivity' => 'int(11)', 
			'ip' => 'varchar(15)', 
			'logged' => 'int(11) unsigned', 
			'roleid' => 'smallint(5) unsigned', 
			'status' => 'tinyint(1) unsigned', 
			'meta' => 'text' 
		) 
	);

	/**
	 * 自动验证定义
	 *
	 * @access public
	 * @var Model
	 */
	public $_validate	=	array(
		array ('username', 'require', '错误：请填写用户名。' ),
		array ('username', 'checkUsername', '错误：用户名不合法。', 0, 'callback' ),	
		array ('nicename', 'require', '错误：请填写昵称。' ),
		array ('nicename', 'checkUsername', '错误：昵称不合法。', 0, 'callback' ),
		array ('email', 'require', '错误：请填写电子邮件地址。' ),
		array ('email', 'email', '错误：电子邮件地址不正确。' ),
		array ('url', 'url', '错误：站点地址不合法。', 2 ),
		array ('username', '', '错误：该用户名已被注册。', 0, 'unique', 1 ),
		array ('email', '', '错误：该电子邮件已被注册。', 0, 'unique', 3 ),
		array ('pass1', 'pass2', '错误：您两次输入的密码不符。', 2, 'confirm' ),
		array ('pass2', 'pass1', '错误：您两次输入的密码不符。', 2, 'confirm' ),
	);

	/**
	 * 自动完成定义
	 *
	 * @access public
	 * @var Model
	 */
	public $_auto		=	array(
		array ('created', 'time', 1, 'function' ), 
		array ('roleid', 'userRole', 1, 'callback' ), 
		array ('meta', 'userMeta', 1, 'callback' ), 
		array ('password', 'phpass', 2, 'callback' ), 
		array ('status', '1', 1 ),
	);
	
	/**
	 * 更新用户登录信息
	 *
	 * @access public
	 * @return bool
	 */
	public function updateUserInfo($userid) {
		
		if (! $userid) {
			return false;
		}
		
		if (false !== $this->where ( "userid=$userid" )->find ()) {
			
			$data = array ();
			$data ['userid'] = $userid;
			$data ['lastactivity'] = TIMESTAMP;
			$data ['logged'] = array ('exp', 'logged+1' );
			$data ['ip'] = tget_client_ip();
			$this->save ( $data );
		}
	}
	
	/**
	 * 检查用户名合法性
	 *
	 * @access public
	 * @param $username 用户名
	 * 
	 * @return bool
	 */
	protected function checkUsername($username) {
		if (! Validate::checkUsername ( $username )) {
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * 用户角色
	 *
	 * @access public
	 * 
	 * @return string
	 */
	protected function userRole() {
		return C ( 'role' );
	}
	
	/**
	 * 用户配置
	 *
	 * @access public
	 * 
	 * @return string
	 */
	protected function userMeta() {
		$meta = array ();
		$meta ['admin_color'] = 'fresh';
		$meta ['show_admin_bar_front'] = 0;
		$meta ['show_admin_bar_admin'] = 0;
		return serialize ( $meta );
	}
	
	/**
	 * 密码phpass加密
	 *
	 * @access public
	 * 
	 * @return string
	 */
	protected function phpass() {
		if (isset ( $_POST ['pass1'] ) && $_POST ['pass1'] !== '' && ($_POST ['pass1'] == $_POST ['pass2'])) {
			return Validate::compilePassword ( $_POST ['pass1'] );
		} else {
			return false;
		}
	}
	
	/**
	 * 验证用户输入的用户名合法性
	 * 
	 * 返回值
	 * 1:成功
	 * -1:用户名不合法
	 * -2:包含要允许注册的词语(disabled
	 * -3:用户名已经存在
	 * @access public
	 * @param string $username   用户名
	 * 
	 * @return int
	 */
	public function checkUser($username) {
		if ($this->checkUsername ( $username )) {
			return - 1;
		}
		if ($this->getByUsername ( $username )) {
			return - 3;
		} else {
			return true;
		}
	}
	
	/**
	 * 验证用户输入的 Email 合法性
	 * 
	 * 返回值
	 * 1:成功
	 * -4:Email 格式有误
	 * -5:Email 不允许注册(disabled
	 * -6:该 Email 已经被注册
	 * @access public
	 * @param string $email   Email
	 * 
	 * @return int
	 */
	public function checkEmail($email) {
		
		if (! Validate::checkEmail ( $email )) {
			return - 4;
		}
		if ($this->getByEmail ( $email )) {
			return - 6;
		} else {
			return true;
		}
	}
	
	/**
	 * 获取用户信息
	 * 
	 * @access public
	 * @param array $map   数组
	 * 
	 * @return array
	 */
	public function getUserInfo($map) {
		return $this->getOneByMap ( $map );
	}
	
	/**
	 * 获取用户个人配置
	 * 
	 * @access public
	 * @param string $userid 用户id
	 * 
	 * @return array
	 */
	public function getUserMeta($userid = null) {
		
		if (null === $userid) {
			global $_T;
			$userid = $_T ['userid'];
		}
		
		return unserialize ( $this->where ( "userid=$userid" )->getField ( 'meta' ) );
	}
	
	/**
	 * 编辑用户信息
	 *
	 * @access public
	 * @param array $cfg   用户资料(数组
	 * @param string $forget_pwd   是否忽略密码验证 1:忽略，更改资料不需要验证密码 :(默认值) 不忽略，更改资料需要验证密码
	 * 
	 * @return int
	 */
	public function editUser($cfg, $forget_pwd = '0') {
		
		// 修改邮件
		if (! empty ( $cfg ['email'] )) {
			$result = $this->updateUser ( $cfg ['username'], '', '', $cfg ['email'], 1 );
			if ($result > 0) {
				$flag = true;
			} else {
				return $result;
			}
		}
		
		// 修改密码，需要原密码
		if (! empty ( $cfg ['old_password'] ) && ! empty ( $cfg ['password'] ) && $forget_pwd == 0) {
			$result = $this->updateUser ( $cfg ['username'], $cfg ['old_password'], $cfg ['password'], '' );
			if ($result > 0) {
				return true;
			} else {
				return $result;
			}
		
		// 重置密码
		} elseif (! empty ( $cfg ['password'] ) && $forget_pwd == 1) {
			$result = $this->updateUser ( $cfg ['username'], '', $cfg ['password'], '', '1' );
			if ($result > 0) {
				$flag = true;
			} else {
				return $result;
			}
		}
		return true;
	}
	
	/**
	 * 本接口函数用于更新用户资料。 
	 * 更新资料需验证用户的原密码是否正确，除非指定 ignoreoldpw 为 1。
	 * 如果只修改 Email 不修改密码，可让 newpw 为空；同理如果只修改密码不修改 Email，可让 email 为空。
	 * 
	 * 返回值
	 * 1:更新成功
	 * 0:没有做任何修改(disabled
	 * -1:旧密码不正确
	 * -4:Email 格式有误
	 * -5:Email 不允许注册(disabled
	 * -6:该 Email 已经被注册
	 * -7:没有做任何修改
	 * -8:该用户受保护无权限更改(disabled
	 * 
	 * @param string $username 用户名
	 * @param string $oldpw 旧密码 
	 * @param string $newpw 新密码，如不修改为空 
	 * @param string $email Email，如不修改为空 
	 * @param bool $ignoreoldpw 是否忽略旧密码 1:忽略，更改资料不需要验证密码  0:(默认值) 不忽略，更改资料需要验证密码
	 * @access public
	 * 
	 * @return int
	 */
	public function updateUser($username, $oldpw, $newpw, $email, $ignoreoldpw = 0) {
		
		if ($email && ($status = $this->checkEmail ( $email )) < 0) {
			return $status;
		}
		
		$row = $this->getByUsername ( $username );
		
		if (! $ignoreoldpw && ! Validate::checkPassword ( $oldpw, $row ['password'] )) {
			return - 1;
		}
		
		$data ['password'] = $newpw ? Validate::compilePassword ( $newpw ) : '';
		$data ['email'] = $email ? $email : '';
		if ($data ['password'] || $data ['email']) {
			/* 这种去除数组中的空值的方法很弱智 */
			foreach ( $data as $k => $v ) {
				if (! $v) {
					unset ( $data [$k] );
				}
			}
			return $this->where ( "username='$username'" )->save ( $data );
		} else {
			return - 7;
		}
	}

}